public class Main {
}

class ListNode {
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val) {
        this.val = val;
    }
}

class MyLinkedList {
    // 链表元素数量
    int size;
    // 链表虚拟头结点
    ListNode head;

    /**
     * 初始化 MyLinkedList 对象。
     */
    MyLinkedList() {
        size = 0;
        head = new ListNode();
    }

    /**
     * 获取链表中下标为 index 的节点的值。如果下标无效，则返回 -1 。
     * @param index
     * @return
     */
    int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode currentNode = head.next;
        for (int i = 0; i < index; i++) {
            currentNode = currentNode.next;
        }
        return currentNode.val;
    }

    /**
     * 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后，新节点会成为链表的第一个节点。
     * @param val
     */
    void addAtHead(int val) {
        addAtIndex(0, val);
    }

    /**
     * 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
     * @param val
     */
    void addAtTail(int val) {
        addAtIndex(size, val);
    }

    /**
     * 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
     * 如果 index 等于链表的长度，那么该节点会被追加到链表的末尾。
     * 如果 index 比长度更大，该节点将 不会插入 到链表中。
     * @param index
     * @param val
     */
    void addAtIndex(int index, int val) {
        if (index > size) {
            return ;
        }
        if (index < 0) {
            index = 0;
        }
        ListNode predNode = head;
        for (int i = 0; i < index; i++) {
            predNode = predNode.next;
        }
        ListNode newNode = new ListNode(val);
        newNode.next = predNode.next;
        predNode.next = newNode;
        size++;
    }

    /**
     * 如果下标有效，则删除链表中下标为 index 的节点。
     * @param index
     */
    void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return ;
        } else if (index == 0) {
          head = head.next;
        } else {
            ListNode predNode = head;
            for (int i = 0; i < index; i++) {
                predNode = predNode.next;
            }
            predNode.next = predNode.next.next;
        }
        size--;
    }
}